package com.shop.controller;

import com.shop.common.Result;
import com.shop.dto.ProductDTO;
import com.shop.entity.Product;
import com.shop.service.ProductService;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 商品管理API
 * @apiNote 提供商品的增、删、改、查等功能
 */
@RestController
@RequestMapping("/api/products")
public class ProductController {

    @Autowired
    private ProductService productService;

    /**
     * 获取所有商品列表
     * @return Result<List<Product>> 商品列表
     */
    @GetMapping
    public Result<List<Product>> getAllProducts() {
        List<Product> products = productService.getAllProducts();
        return Result.success(products);
    }

    /**
     * 根据ID查询商品
     * @param id 商品ID
     * @return Result<Product> 查询到的商品，如果不存在则data为null
     */
    @GetMapping("/{id}")
    public Result<Product> getProductById(@PathVariable Long id) {
        Product product = productService.getProductById(id);
        if (product != null) {
            return Result.success(product);
        }
        return Result.error("商品不存在");
    }

    /**
     * 新增商品
     * @param productDTO 包含商品信息的DTO
     * @return Result<Product> 新增的商品信息
     */
    @PostMapping
    public Result<Product> createProduct(@RequestBody ProductDTO productDTO) {
        Product product = new Product();
        product.setName(productDTO.getName());
        product.setPrice(productDTO.getPrice());
        product.setStockQuantity(productDTO.getStockQuantity());
        product.setCategory(productDTO.getCategory());
        product.setDescription(productDTO.getDescription());
        product.setStatus(productDTO.getStatus());
        productService.addProduct(product);
        return Result.success(product);
    }

    /**
     * 更新商品信息
     * @param id 商品ID
     * @param productDTO 更新的商品信息
     * @return Result<Product> 更新后的商品信息
     */
    @PutMapping("/{id}")
    public Result<Product> updateProduct(@PathVariable Long id, @RequestBody @Valid ProductDTO productDTO) {
        Product product = productService.getProductById(id);
        if (product == null) {
            return Result.error("商品不存在");
        }
        product.setName(productDTO.getName());
        product.setDescription(productDTO.getDescription());
        product.setPrice(productDTO.getPrice());
        product.setStockQuantity(productDTO.getStockQuantity());
        product.setCategory(productDTO.getCategory());
        product.setStatus(productDTO.getStatus());
        productService.updateProduct(product);
        return Result.success(product);
    }

    /**
     * 根据ID删除商品
     * @param id 商品ID
     * @return Result<Void>
     */
    @DeleteMapping("/{id}")
    public Result<Void> deleteProduct(@PathVariable Long id) {
        productService.deleteProduct(id);
        return Result.success();
    }

    /**
     * 商品入库（增加库存）
     * @param id 商品ID
     * @param quantity 增加的数量
     * @return Result<Product> 更新后的商品信息
     */
    @PostMapping("/{id}/stock/increase")
    public Result<Product> increaseStock(@PathVariable Long id, @RequestParam int quantity) {
        productService.increaseStock(id, quantity);
        Product product = productService.getProductById(id);
        return Result.success(product);
    }

    /**
     * 商品出库（减少库存）
     * @param id 商品ID
     * @param quantity 减少的数量
     * @return Result<Product> 更新后的商品信息
     */
    @PostMapping("/{id}/stock/decrease")
    public Result<Product> decreaseStock(@PathVariable Long id, @RequestParam int quantity) {
        productService.decreaseStock(id, quantity);
        Product product = productService.getProductById(id);
        return Result.success(product);
    }

    /**
     * 获取低库存商品
     * @param minStock 最低库存阈值
     * @return Result<List<Product>> 低库存商品列表
     */
    @GetMapping("/low-stock")
    public Result<List<Product>> getLowStockProducts(@RequestParam(defaultValue = "10") int minStock) {
        List<Product> products = productService.findLowStockProducts(minStock);
        return Result.success(products);
    }

    /**
     * 根据商品编码查询商品
     * @param code 商品编码
     * @return Result<Product> 查询到的商品，如果不存在则data为null
     */
    @GetMapping("/code/{code}")
    public Result<Product> getProductByCode(@PathVariable String code) {
        Product product = productService.findProductByCode(code);
        if (product != null) {
            return Result.success(product);
        }
        return Result.error("商品不存在");
    }

    /**
     * 切换商品状态
     * @param id 商品ID
     * @param status 新状态
     * @return Result<Void>
     */
    @PutMapping("/{id}/status")
    public Result<Void> changeProductStatus(@PathVariable Long id, @RequestParam Integer status) {
        productService.changeProductStatus(id, status);
        return Result.success();
    }
}
